package leetcode_周赛._2023._12;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 第 378 场周赛
 * AC_3
 *
 * @author yezh
 * @date 2023/12/31 18:07
 */
public class _31 {

    /**
     * 找出出现至少三次的最长特殊子字符串 II
     * 算法：分类讨论 + 排序
     * <p/>
     * 统计每个字符对应的特殊字符的长度存到数组 a
     * 将 a 从大到小排序
     * 1、L1 = a[0], 则最长的特殊字符串长度为 L1 - 2
     * 2、L2 = a[1],
     * 如果 L2 = L1, 则最长的特殊字符串长度为 L1 - 1
     * 如果 L2 < L1, 则最长的特殊字符串长度为 L2
     * 这两种情况合并成 min(L1 - 1, L2)
     * 3、L3 = a[2], 从 L1、L2、L3 各取一个长度为 L3 的特殊字串
     */
    public int maximumLength(String s) {
        Map<Character, List<Integer>> groups = new HashMap<>();
        int len = s.length();
        for (int i = 0, cnt = 0; i < len; i++) {
            ++cnt;
            if (i == len - 1 || s.charAt(i) != s.charAt(i + 1)) {
                groups.computeIfAbsent(s.charAt(i), key -> new ArrayList<>()).add(cnt);
                cnt = 0;
            }
        }
        int ans = 0;
        for (List<Integer> a : groups.values()) {
            a.sort((x, y) -> y - x);
            a.add(0);
            a.add(0);
            int c1 = a.get(0) - 2, c2 = Math.min(a.get(0) - 1, a.get(1)), c3 = a.get(2);
            ans = Math.max(ans, Math.max(c1, Math.max(c2, c3)));
        }
        return ans == 0 ? -1 : ans;
    }

}
